package com.example.controller;

import com.aliyun.iot20180120.Client;
import com.aliyun.iot20180120.models.PubRequest;
import com.aliyun.iot20180120.models.PubResponse;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.entity.DeviceInfo;
import com.example.service.IBgAlarmHistoryLogService;
import com.example.service.IBpAlarmHistoryLogService;
import com.example.service.IDeviceInfoService;
import com.example.vo.DeviceStatusVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import java.util.Base64;
import java.util.List;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author ysr_xian
 * @since 2022-05-29
 */
@RestController
@RequestMapping("/deviceInfo")
public class DeviceInfoController {

    @Autowired
    private IDeviceInfoService deviceInfoService;
    @Autowired
    private IBpAlarmHistoryLogService bpAlarmHistoryLogService;
    @Autowired
    private IBgAlarmHistoryLogService bgAlarmHistoryLogService;

    @GetMapping("/list")
    public List<DeviceInfo> list() {
        return deviceInfoService.list();
    }

    /**
     * 报警状态 设备总数 在线总数 报警总数
     */
    @GetMapping("/getDeviceStatus")
    public DeviceStatusVO getDeviceStatus() {
        DeviceStatusVO deviceStatusVO = new DeviceStatusVO();
        deviceStatusVO.setNumDevice(deviceInfoService.count());
        deviceStatusVO.setNumAlarm(bpAlarmHistoryLogService.count() + bgAlarmHistoryLogService.count());
        deviceStatusVO.setNumOnline(deviceInfoService.count(
                new QueryWrapper<DeviceInfo>().eq("connect_status", true)));
        return deviceStatusVO;
    }

    /***************************************************************************************/

    @Value("${user.accessKeyId}")
    private String accessKeyId;

    @Value("${user.accessKeySecret}")
    private String accessKeySecret;

    @Value("${user.uid}")
    private String uid;

    @Value("${iot.regionId}")
    private String regionId;

    @Value("${iot.instance}")
    private String instance;

    @PostMapping("/bpThreshold")
    boolean bpThreshold(@RequestBody DeviceInfo deviceInfo) throws Exception {
        Config config = new Config();
        // 您的AccessKey ID。
        config.accessKeyId = accessKeyId;
        // 您的AccessKey Secret。
        config.accessKeySecret = accessKeySecret;
        // 您的可用区ID。
        config.regionId = "cn-shanghai";
        //初始化SDK客户端。
        Client client = new Client(config);

        PubRequest request = new PubRequest()
                .setIotInstanceId(instance)
                .setProductKey("gv6fifLfXg4")   // 改成自己的产品key
                .setMessageContent(Base64.getEncoder().encodeToString("血压数据上传成功！！！".getBytes()))
                .setTopicFullName("/gv6fifLfXg4/" + deviceInfo.getDeviceName() + "/user/setBpThreshold")      // 改成自己的产品key
                .setQos(0);//目前支持QoS0和QoS1。
        try {
            PubResponse response = client.pub(request);
            // response中包含服务端响应的body和headers。
            //获取本次调用requestId。
            System.out.println(response.getBody().getRequestId());
            //调用是否成功。
            System.out.println(response.getBody().getSuccess());
            //调用成功。
            if (response.getBody().getSuccess()) {
                //获取云端消息ID。
                System.out.println(response.getBody().getMessageId());
                //任务：业务逻辑，修改表中设备的温度阈值


                return true;
            } else {
                //调用失败。
                //获取调用失败错误码。
                System.out.println(response.getBody().getCode());
                //获取调用失败错误描述。
                System.out.println(response.getBody().getErrorMessage());
                return false;
            }
        } catch (TeaException error) {
            //服务端业务异常。
            System.out.println(error.getCode());
            System.out.println(error.getMessage());
        } catch (Exception e) {
            //其他运行时异常。
            e.printStackTrace();
        }
        return true;
    }

    @PostMapping("/bgThreshold")
    boolean bgThreshold(@RequestBody DeviceInfo deviceInfo) throws Exception {
        Config config = new Config();
        // 您的AccessKey ID。
        config.accessKeyId = accessKeyId;
        // 您的AccessKey Secret。
        config.accessKeySecret = accessKeySecret;
        // 您的可用区ID。
        config.regionId = "cn-shanghai";
        //初始化SDK客户端。
        Client client = new Client(config);

        PubRequest request = new PubRequest()
                .setIotInstanceId(instance)
                .setProductKey("gv6fifLfXg4")   // 改成自己的产品key
                .setMessageContent(Base64.getEncoder().encodeToString("血压数据上传成功！！！".getBytes()))
                .setTopicFullName("/gv6fifLfXg4/" + deviceInfo.getDeviceName() + "/user/setBgThreshold")      // 改成自己的产品key
                .setQos(0);//目前支持QoS0和QoS1。
        try {
            PubResponse response = client.pub(request);
            // response中包含服务端响应的body和headers。
            //获取本次调用requestId。
            System.out.println(response.getBody().getRequestId());
            //调用是否成功。
            System.out.println(response.getBody().getSuccess());
            //调用成功。
            if (response.getBody().getSuccess()) {
                //获取云端消息ID。
                System.out.println(response.getBody().getMessageId());
                //任务：业务逻辑，修改表中设备的温度阈值


                return true;
            } else {
                //调用失败。
                //获取调用失败错误码。
                System.out.println(response.getBody().getCode());
                //获取调用失败错误描述。
                System.out.println(response.getBody().getErrorMessage());
                return false;
            }
        } catch (TeaException error) {
            //服务端业务异常。
            System.out.println(error.getCode());
            System.out.println(error.getMessage());
        } catch (Exception e) {
            //其他运行时异常。
            e.printStackTrace();
        }
        return true;
    }

}

